package com.example.math;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 奖金计算工具类
 * @author 
 *
 */
public class DrawMathUtil {
	//默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    /**
     * 提供精确的加法运算。
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();

    }

 
    /**
     * 提供（相对）精确的除法运算，当发生除不尽的情况时，精确到
     * 小数点以后10位，以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }

 
    /**
     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     * 定精度，以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
	/**
	 * 四舍六入五成双
	 * @param value
	 * @param count 位数
	 * @return
	 */
	public static double getPrix(double value, int count){
        // 四舍六入五成双
        BigDecimal decimal = BigDecimal.valueOf(value); 
        if(decimal.toPlainString().indexOf(".") == -1){
        	return keepPointRountCount(keepPointCount(value,count+1), count);
        }
		String dotBack = decimal.toPlainString().split("\\.")[1];
        
        if (dotBack.length() > count && count > 0){
        	String afterDigitStr = dotBack.substring(count, count+1);
        	String beforeDigitStr = dotBack.substring(count-1, count);
        	int afterDigit = Integer.parseInt(afterDigitStr);
        	int beforeDigit = Integer.parseInt(beforeDigitStr);
        	// 后一位(第三位)小数是5的时候,看第二位，第二位偶数就舍去第三位,第二位奇数，第三位就进一位
        	if(afterDigit == 5 && beforeDigit % 2 == 0){
        		return keepPointCount(value, count);
        	}else if(afterDigit == 5 && beforeDigit % 2 == 1){
        		return keepPointRountCount(keepPointCount(value, count) + 1/Math.pow(10, count),count);
        	}else{
        		return keepPointRountCount(keepPointCount(value,count + 1), count);
        	}
        }else{
        	return keepPointRountCount(keepPointCount(value,count+1), count);
        }


    } 
	/**
	 * 保留小数点位数(抹掉后续数字)
	 * @param value
	 * @param count
	 * @return
	 */
	public static double keepPointCount(double value, int count){
		double keepValue = BigDecimal.valueOf(value).setScale(count,RoundingMode.DOWN).doubleValue();
		return keepValue;
	}
	/**
	 * 保留小数点位数(四舍五入方式)
	 * @param value
	 * @param count
	 * @return
	 */
	public static double keepPointRountCount(double value, int count){
		double keepValue = BigDecimal.valueOf(value).setScale(count,RoundingMode.HALF_UP).doubleValue();
		return keepValue;
	}
	
	public static void main(String[] args){
//		double t = 23.355;
//		System.out.println("old:"+t+",new:"+getPrix(t, 2));
//		double t1 = 23.356;
//		System.out.println("old:"+t1+",new:"+getPrix(t1, 2));
//		double t2 = 23.353;
//		System.out.println("old:"+t2+",new:"+getPrix(t2, 2));
//		double t3 = 23.3;
//		System.out.println("old:"+t3+",new:"+getPrix(t3, 2));
//		double t4 = 23;
//		System.out.println("old:"+t4+",new:"+getPrix(t4, 2));
		double t5 = 23.3555;
		System.out.println("old:"+t5+",new:"+getPrix(t5, 2));
		double t6 = 23;
		System.out.println("old:"+t6+",new:"+getPrix(t6, 2));
		double a = 1.9;
		double b = 0.3;
		System.out.println("a+b:"+(a+b));
		System.out.println("a+b:"+add(a,b));
		System.out.println("a-b:"+sub(a,b));
		System.out.println("a*b:"+mul(a,b));
		System.out.println("a/b:"+div(a,b));
	}
}
